#pragma once

#include "tester_base.hpp"
#include "matrix.hpp"

#include <random>

class GEMVTester : public BaseTester {
 public:
  GEMVTester(size_t row, size_t col);
  void DataGenerate() override;
  void Baseline() override {
    _baseline_result = Baseline(_input_matrix, _input_vector);
  };
  void Implementation() override {
    _impl_result = Implementation(_input_matrix, _input_vector);
  };
  bool CheckResult() override;

  std::vector<int64_t> Baseline(const Matrix<int64_t> &matrix,
      const std::vector<int64_t> &vector);
  std::vector<int64_t> Implementation(const Matrix<int64_t> &matrix,
      const std::vector<int64_t> &vector);

 private:
  Matrix<int64_t> _input_matrix;
  std::vector<int64_t> _input_vector;
  std::vector<int64_t> _baseline_result;
  std::vector<int64_t> _impl_result;
};
